﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//结构体
struct stu
{
	char name[20];
	int age;
	char gender[20];
	//int tele[7];
	//应该这样初始化
	char tele[12];

}s2;//可以在这里定义结构体变量,并且这里的定义的变量是全局变量

//对了还可以直接定义全局变量
//struct stu s3 = { "zhangsan",24,"male","276495834995" };
//int main()
//{
//	//还可以定义结构体的局部变量
//	struct stu d1 = { 0 };
//	//一个提示点哈，数字不用加双引号，字符串才需要加双引号
//	//喔喔喔，看懂了，单个struct不用用{}隔开
//	//struct stu s1 = { {"zhangsan"},{23},{"male"},{666666} };
//	//应该这样初始化
//	//喔喔，有注意到一个点，一长串的数字好像属于字符串的范畴
//	//而不是数字的范畴
//	struct stu s1 = { "zhangsan",23,"male","6666666"};
//	//还有就是666666，不能用%d打印的原因是ASCII码值的范围是0--127
//	printf("%s\n", s1.name);
//	printf("%s\n", s1.gender);
//	printf("%d\n", s1.age);
//	//找了半天中有发现问题了，打印字符串应该用%s，而不是%d
//	printf("%s\n", s1.tele);
//	//试了一下直接初始化为零在屏幕上是没有结果的，
//	//因为ascii码值0，无法在屏幕上打印出结果
//	printf("%s\n", d1.name);
//	printf("%s\n", d1.gender);
//	printf("%d\n", d1.age);
//	printf("%d\n", d1.tele);
//	return 0;
//}


//接着来看一下结构体的嵌套
//喔喔喔，原来结构体嵌套就是一个结构的性质叠加在另一个结构体上
//struct peo
//{
//	char name[20];
//	char gender[20];
//	int age;
//	char hobby[50];
//
//};
//struct ebook
//{
//	struct peo data[100];
//	//像以上操作就可以实现储存一百个人的信息
//	
//};//备注一哈ebook鹏哥说是是电话本的意思,查了一哈是电子书1的意思
//int main()
//{
//	struct peo s2 = { "shishi","female",23,"play badminton" };
//	struct ebook eb = { {{"sasha","female",18,"eat meal"},{"mikasa","female",19,"eren"},{"hanji","female",27,"giant"}} };
//
//    //要想输出嵌套的结果体，就需要通过用外部结构体的名字，
//	// 自己名字是指创建了结构体以后取的变量名
// //为什么输入data[1]为什么是米卡萨的信息呢，这是因为数组的下标是从零开始的
// //将等于回顾一下前面的知识
//	printf("%s\n", eb.data[1].name);
//	printf("%s\n", eb.data[1].gender);
//	printf("%d\n", eb.data[1].age);
//	printf("%s\n", eb.data[1].hobby);
//	printf("%s\n", eb.data[0].name);
//	printf("%s\n", eb.data[0].gender);
//	printf("%d\n", eb.data[0].age);
//	printf("%s\n", eb.data[0].hobby);
//	return 0;
//}

//整形提升
//C语⾔中整型算术运算总是⾄少以缺省（默认）整型类型的精度来进⾏的。
//为了获得这个精度，
//表达式中的字符和短整型操作数在使⽤之前被转换为普通整型，
// 这种转换称为整型提升
//int main()
//{
//	char xrj = 1106;
//	//00000000000000000000001001010010-1106的源码也是补码
//	//00000000000000000000001000010001-529的源码也是补码
//	//00000000000000000000010001010111
//	//喔喔，不是这么算的，因为char是一个字节是八个bit位所以要截断为八位
//	//00010001-529截断后的的补码
//	// 对了整形提升高位用0补齐
//	//000000000000000000001010010-1106截断并进行整型提升后的的补码
//	//01100011-相加以后的结果
//	//64+32+2+1=99
//	//欧克，希望你搞懂，不行咱再来一道
//	char lpy = 529;
//	char love = xrj + lpy;
//	char a = 210;
//	//11010010-截断以后的210的补码
//	// 三没有被截断，因为这个大小可以放下3
//	//00000011-3的补码
//	//11010010
//	//11111111111111111111111111010101-相加以后的补码，进行整形提升
//	//因为是负数进行运算
//	//10000000000000000000000000101010-反码
//	//10000000000000000000000000101011-补码
//	//32+8+3//是2的5次方不是四次方，计算正确
//	char b = 3;
//	char c = a + b;
//	printf("%d\n", love);
//	printf("%d\n", c);
//
//	return 0;
//}


//这叫算术转换
//其次就是两种不同类型的数相加，得到的数的类型是大小更大的数的类型
//例如int + double 得到的数的类型是double


//再来就是回忆一哈
//&-取地址操作符
//*-下标引用操作符
int main()
{
	int a = 3;
	//w是一个指针变量
	//所以这里要放一个地址，所以才会&a，这是将a的地址放在里面
	//而*解引用就是将a这个地址找出来，然后可以对这里的的元素进行改变
	char* w = &a;
	*w = 210;
	printf("%d\n", a);
	return 0;
}